SAP(六)内表 您所在的位置:网站首页 sap display内表的静态方法 SAP(六)内表

SAP(六)内表

#SAP(六)内表| 来源: 网络整理| 查看: 265

一、老内表类型 老式的内表类型定义

老式内表只有标准内表一种,使用OCCURS选项来定义了标准内表,这是ABAP3.0之前的定义内表的做法了,在新版的ABAP不建议使用,因为在新的版本中有三种内表类型(标准、排序、哈希)。 TYPES OCCURS .

内表中行的数据类型在中指定。要指定行的数据类型,可以使用 TYPE 或 LIKE 参数。

二、新内表类型

ABAP中有三种类型的内表:

标准表(STANDARD TABLE) 系统为该表的每一行数据生成一个逻辑索引,自己内部维护着行号(Index)的编码。表的键值不唯一,且没有按照表键自动进行排序,支持通过索引访问和键访问两种方式。填充标准表时可以插入到指定位置或现在有行之后,程序对内表的寻址操作可以通过关键字或索引进行。在对表进行插入删除等操作时,各数据行在内存中的物理位置不变,系统仅重新排列各数据行的索引值。当经常用索引访问表的时候就选择标准表。

排序表(SORTED TABLE) 也有一个逻辑索引,不同之处是排序表总是按其表关键字升序排序后现进行存储,排序内表自己内部也维护着行号的编号,表的键值可以唯一或者不唯一,支持通过索引访问和键访问两种方式。如果经常使用键来访问数据,或者希望数据能够自动排序时,就用排序表。

哈希表(HASHED TABLE) 哈希表通过哈希函数生成的表键来标识和快速访问表行,哈希表中的表键没有顺序,其值在表中必须唯一,只允许通过表键来访问哈希表。寻址一个数据行的所需时间与表行数无关。如果内表非常大而且希望用主键访问,就用哈希表。 在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/4d440508c9394b1ca3bef435497d4fda.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hb21pYm9vaw==,size_16,color_F对于索引类型的内表,当一个行操作语句执行结束后,SY-TABIX将返回该行的索引,成功SY-SUBRC返回0。

虽然索引比使用关键字定位行要快,但在大多数情况下,我们通过关键字定位一行数据,因数据来自数据库,我们不知道数据在哪行。

使用关键字定位一行数据不同内表的效率比较如下:

标准表,取决于表的行数,随行数线性增加。(但也可以先进行排序,再明确使用二分搜索查找)

排序表,取决于表的行数,随行数对数级增长(系统默认就会使用二分搜索方式来查找)。

哈希表,与行数无关,在大数据量的情况下根据关键字查询是最快的FFFFF,t_70)

DATA itab { {TYPE [STANDARD]|SORTED|HASHED TABLE OF [REF TO] type} | {LIKE [STANDARD]|SORTED|HASHED TABLE OF dobj} } *STANDARD TABLE: DATA ITAB_STANDARD TYPE STANDARD TABLE OF MARA. *SORTED TABLE: WITH UNIQUE KEY 或WITH NON-UNIQUE KEY 都可以。 DATA ITAB_SORTED TYPE SORTED TABLE OF MARA WITH NON-UNIQUE KEY TABLE_LINE. *HASHED TABLE:只能为WITH UNIQUE KEY。 DATA ITAB_HASHED TYPE HASHED TABLE OF MARA WITH UNIQUE DEFAULT KEY. [ WITH [UNIQUE | NON-UNIQUE] {{KEY [primary_key [ALIAS key_name] COMPONENTS] comp1 comp2 ...} | {DEFAULT KEY} } ]"主键索引 [ WITH {UNIQUE HASHED}|{UNIQUE SORTED}|{NON-UNIQUE SORTED}"secondary_key1,第二索引 KEY key_name COMPONENTS comp1 comp2 ... ] [ WITHsecondary_key2 ]…"第二索引,最多支持15个第二索引 ] [INITIAL SIZE n] [WITH HEADER LINE] [VALUE IS INITIAL]

REF TO:表示内表类型为引用类型(该类型内表是用来存储引用的,可指向某个内表)

INITIAL SIZE n:为内表指定初始行数。如果n为0,则会自动分配合适的行数。修改初始内存要求仅用于嵌套表,对于最外层内表没有必要,指定后反可能影响性能,所以一般不用指定。另外,该值对 APPEND…SORTED BY…有特殊的作用

2.1 使用第二索引

像数据库表一样,内表也可以创建多个索引,内表有三种类型第二索引: UNIQUE HASHED: 哈希算法第二索引 UNIQUE SORTED: 唯一升序第二索引 NON-UNIQUE SORTED: 非唯一升序第二索引

TYPES sbook_tab TYPE STANDARD TABLE OF sbook "主索引:如果要为主索引指定名称,则只能使用预置的 primary_key, "但可以通过后面的 ALIAS 选项来修改(注:ALIAS选项只能用于排序与哈希表) WITH NON-UNIQUE KEY primary_key "ALIAS my_primary_key COMPONENTS carrid connid fldate bookid "第一个第二索引:唯一哈希算法 WITH UNIQUE HASHED KEY hash_key COMPONENTS carrid connid fldate bookid "第二第二索引:非唯一升序排序索引 WITH NON-UNIQUE SORTED KEY sort_key COMPONENTS customid.

第二索引会影响哪些行将被处理,以及处理顺序:

可以在READ TABLE itab, LOOP AT itab, MODIFY itab, DELETE itab内表操作语句中通过WITH [TABLE] KEY … COMPONENTS或者USING KEY选项指定key_name来使用第二索引

可以在INSERT itab与APPEND语句中通过USING KEY选项来使用源内表的第二索引

DATA itab TYPE HASHED TABLE OF dbtab WITH UNIQUE KEY col1 col2 ... "向内表itab中添加大量的数据 ... READ TABLE itab "使用非主键进行搜索,搜索速度将会很慢 WITH KEY col3 = ... col4 = ... ASSIGNING ...

上面程序中定义了一个哈希内表,在读取时未使用主键,在大数据量的情况下速度会很慢,所以在搜索字段上创建第二索引:

ATA itab TYPE HASHED TABLE OF dbtab WITH UNIQUE KEY col1 col2 ... "为非主键创建第二索引 WITH NON-UNIQUE SORTED KEY second_key COMPONENTS col3 col4 ... "向内表itab中添加大量的数据 ... READ TABLE itab "根据第二索引进行搜索,会比上面程序快 WITH TABLE KEY second_key COMPONENTS col3 = ... col4 = ... ASSIGNING ... ... "在循环内表的Where条件中,如果内表不是排序内表,则不会使用二分搜索,如果使用SORTED KEY,则循环时,是否会用到二分搜索? LOOP AT itab USING KEY second_key wherecol3=... col4=... . ... ENDLOOP.

INDEX/ANY TABLE通用型内表

除上面三种标准类型外,还有一般性类型,即索引表(INDEX TABLE)和任意表(ANY TABLE),一般性类型可以用于类型定义中,但不能用于声明一个内表对象,因为它并没有指明任何明确的表类型,因而系统无法确定对其操作方式。一般性类型还可以用于指明字段符号和接口参数的类型,其实际类型可能在运行期内才能够确定。 在这里插入图片描述2.2 创建内表 2.2.1参照局部表类型创建内表 首先定义结构体类型

TYPES : BEGIN OF , ...... END OF .

然后参照此结构体类型定义内表类型

TYPES t_tab TYPE STANDARD TABLE OF t_str WITH {ON-UNIQUE/UNIQU} KEY INITIAL SIZE 100.

最后再参照此内表的类型定义内表。

DATA gt_itab TYPE t_tab .

举例:

TYPES : BEGIN OF t_line, field1 TYPE c LENGTH 5, field2 TYPE c LENGTH 4, field3 TYPE i , END OF t_line. TYPES t_tab TYPE STANDARD TABLE OF t_line."后面可以加WITH NON-UNIQUE DEFAULT KEY但是会默认存在此语句所以不需要加 "也可以自定义关键字TYPES t_tab TYPE STANDARD TABLE OF t_line WITH KEY field1. DATA gt_itab TYPE t_tab WITH HEADER LINE."表头 gt_itab-field1 = 'qq'. gt_itab-field2 = 'qq1'. gt_itab-field3 = '1'. APPEND gt_itab. READ TABLE gt_itab INDEX 1."读取表中第一行 WRITE : / gt_itab-field1 , gt_itab-field2 , gt_itab-field3 .

还可以直接参照此结构体定义内表,此时不能用TYPE语句,需要用LIKE语句。

DATA : BEGIN OF t_line, field1 TYPE c LENGTH 5, field2 TYPE c LENGTH 4, field3 TYPE i , END OF t_line. TYPES t_tab LIKE STANDARD TABLE OF t_line WITH NON-UNIQUE DEFAULT KEY no WITH HEADER LINE."

2.2.2 参照全局表定义内表

DATA : gt_itab TYPE WITH KEY INITIAL SIZE . DATA gt_itab TYPE SORTED TABLE OF scarr WITH UNIQUE KEY carrid. DATA gs_str LIKE LINE OF gt_itab. SELECT * INTO TABLE gt_itab FROM scarr. LOOP AT gt_itab INTO gs_str. WRITE : /gs_str-carrid , gs_str-carrname. ENDLOOP.

带表头与不代表头的区别 带表头

TYPES : BEGIN OF t_line, col1 TYPE i, col2 TYPE i, END OF t_line. DATA gt_itab1 TYPE STANDARD TABLE OF t_line WITH HEADER LINE. Do 5 TIMES. gt_itab1-col1 = sy-index. gt_itab1-col2 = sy-index * 2. APPEND table gt_itab1. ENDDO. LOOP AT gt_itab1 . WRITE : / gt_itab1-col1,gt_itab1-col2. ENDLOOP. `` 不带表头 ```sql TYPES : BEGIN OF t_line, col1 TYPE i, col2 TYPE i, END OF t_line. DATA: gt_itab2 TYPE STANDARD TABLE OF t_line, gs_wa LIKE LINE OF gt_itab2. Do 5 TIMES. gt_itab2-col1 = sy-index. gt_itab2-col2 = sy-index * 2. APPEND gs_wa TO gt_itab2. ENDDO. LOOP AT gt_itab2 INTO gs_wa. WRITE : / gs_wa-col1,gs_wa-col2. ENDLOOP.

标准表不能用unique,也无需指明Non-unique,排序表可以用unique和Non-unique,哈希表不能用Non-unique,必须指明unique。 标准表 append 速度快,APPEAD较慢。 排序表已经排序所以不需要用SORT命令,自带不需要BINARY SEARCH,Read速度较快。APPEAD最慢。 哈希表,READ速度最快,APPEAD最慢。 二分法READ速度比一半查询快

2.2.3 内表初始化 Clear itab. *带表头的内表删除的是内表的表头,不带表头的内表删除的是表体。 Clear itab[]. *所以带表头要加[]. REFRESH itab.只删除表内数据,无法删除内存空间,若想是释放内存空间需要使用FREE语句。 FREE itab.

2.2.4内表整体操作 内表间赋值

两个内表添加使用批量增加代替逐行

*不推荐: LOOP AT int_fligh1. APPEND int_fligh1 TO int_fligh2. ENDLOOP. *推荐: Append lines of int_fligh1 to int_fligh2.

比较内表 EQ, =, NE, , >=, LE, , LT, [BY (otab)]} }.

默认是升序。 由于排序内表具有自动排序功能,因此用SORT关键字对排序内表进行排序没有任何意义,也将会导致程序的编译错误 根据指定的字段进行排序 BY 单行操作 在这里插入图片描述多行操作

在这里插入图片描述

INSERT语句

TYPES : BEGIN OF t_line, col1 TYPE i, col2 TYPE i, END OF t_line. DATA: gt_itab1 TYPE STANDARD TABLE OF t_line WITH HEADER LINE, gt_itab2 TYPE STANDARD TABLE OF t_line, gs_wa LIKE LINE OF gt_itab2. Do 5 TIMES. gt_itab1-col1 = sy-index. gt_itab1-col2 = sy-index * 2. INSERT table gt_itab1. ENDDO. MOVE gt_itab1[] TO gt_itab2. LOOP AT gt_itab2 INTO gs_wa. WRITE : / gs_wa-col1,gs_wa-col2. ENDLOOP.

当你不知道数据传输和表的类型时,就用DEBUG一步步去执行。 在这里插入图片描述

不同内表具有各自不同的Insert效果

DATA : BEGIN OF gs_line, col1 TYPE c, col2 TYPE n, END OF gs_line. *DATA gt_itab LIKE STANDARD TABLE OF gs_line WITH NON-UNIQUE KEY col1. *DATA gt_itab LIKE SORTED TABLE OF gs_line WITH UNIQUE KEY col1. DATA gt_itab LIKE HASHED TABLE OF gs_line WITH UNIQUE KEY col1. gs_line-col1 = 'B'. gs_line-col2 = 1. INSERT gs_line INTO TABLE gt_itab. gs_line-col1 = 'A'. gs_line-col2 = 2. INSERT gs_line INTO TABLE gt_itab. gs_line-col1 = 'A'. gs_line-col2 = 3. INSERT gs_line INTO TABLE gt_itab. gs_line-col1 = 'C'. gs_line-col2 = 4. INSERT gs_line INTO TABLE gt_itab. BREAK-POINT.

ABAP中的系统变量SY-INDEX与SY-TABIX 系统变量SY-INDEX与SY-TABIX是用来记录循环的次数或者索引的,不同的是SY-INDEX在DO…ENDDO中是有效的,而SY-TABIX在LOOP…ENDLOOP中及READ内表时获取相应的索引。

APPEND

TYPES : BEGIN OF t_line, field1 TYPE c LENGTH 5, field2 TYPE c LENGTH 4, field3 TYPE i , END OF t_line. TYPES t_tab TYPE STANDARD TABLE OF t_line."后面可以加WITH NON-UNIQUE DEFAULT KEY但是会默认存在此语句所以不需要加 "也可以自定义关键字TYPES t_tab TYPE STANDARD TABLE OF t_line WITH KEY field1. DATA gt_itab TYPE t_tab WITH HEADER LINE."表头 gt_itab-field1 = 'qq'. gt_itab-field2 = 'qq1'. gt_itab-field3 = '1'. APPEND gt_itab. READ TABLE gt_itab INDEX 1."读取表中第一行 WRITE : / gt_itab-field1 , gt_itab-field2 , gt_itab-field3 .

COLLECT语句

修改语句

利用WHERE条件修改多条数据 DATA : BEGIN OF gs_line, carrid TYPE sflight-carrid, connid TYPE sflight-connid, carrname TYPE scarr-carrname, END OF gs_line. DATA gt_itab LIKE TABLE OF gs_line. SELECT carrid connid INTO CORRESPONDING FIELDS OF TABLE gt_itab FROM sflight. SORT gt_itab BY carrid.”因为AT now的特点所以首先要给AT now的关键字进行排序。 LOOP AT gt_itab INTO gs_line. AT NEW carrid."AT NOW 是LOOP内表时,与上一条数据比较有价值的变化的字段存在时执行命令。 SELECT SINGLE carrname INTO gs_line-carrname FROM scarr WHERE carrid = gs_line-carrid. MODIFY gt_itab FROM gs_line INDEX sy-tabix TRANSPORTING carrname. ENDAT. WRITE : / sy-tabix , gs_line-carrid , gs_line-carrname. ENDLOOP.

当数据过多时只显示部分表, 在这里插入图片描述 可以在下图选择显示数目 在这里插入图片描述

利用索引修改一条数据 DATA : BEGIN OF gs1_line, carrid TYPE sflight-carrid, connid TYPE sflight-connid, carrname TYPE scarr-carrname, END OF gs1_line. DATA gt1_itab LIKE TABLE OF gs1_line. SELECT carrid connid INTO CORRESPONDING FIELDS OF TABLE gt1_itab FROM sflight. SORT gt1_itab BY carrid."最好要排序 LOOP AT gt1_itab INTO gs1_line. SELECT SINGLE carrname INTO gs1_line-carrname FROM scarr WHERE carrid = gs1_line-carrid. MODIFY gt1_itab FROM gs1_line . WRITE : / gs1_line-carrid , gs1_line-carrname. ENDLOOP. 利用WHERE条件删除多条数据 DATA : BEGIN OF gs1_line, carrid TYPE sflight-carrid, connid TYPE sflight-connid, END OF gs1_line. DATA gt1_itab LIKE TABLE OF gs1_line WITH NON-UNIQUE KEY carrid. SELECT carrid connid INTO CORRESPONDING FIELDS OF TABLE gt1_itab FROM sflight. SORT gt1_itab BY carrid. DELETE gt1_itab WHERE carrid = 'AA' AND connid = '10'. LOOP AT gt1_itab INTO gs1_line. WRITE : / gs1_line-carrid , gs1_line-connid. ENDLOOP.

READ 读取行

READ TABLE itab { {FROM wa [USING KEY key_name|(name)]} | {WITH TABLE KEY [key_name|(name) COMPONENTS] {comp_name1|(name1)} = dobj1 {comp_name2|(name2)} = dobj2 ...} | WITH KEY {comp1 = dobj1 comp2 = dobj2 ... [BINARY SEARCH]} | {key_name|(name) COMPONENTS comp1 = dobj1 comp2 = dobj2 ...} |INDEX idx [USING KEY key_name|(name)] } {INTO wa [[COMPARING { {comp1 comp2...}|{ALL FIELDS}|{NO FIELDS} }] [TRANSPORTING { {comp1 comp2...}|{ALL FIELDS} }]]}| {ASSIGNING [CASTING]} | {REFERENCE INTO dref} | {TRANSPORTING NO FIELDS}.. comp1 comp2 ... ... { comp_name[-sub_comp][{+off(len)}|{->attr}] } | {(name)} ...

如果未指定USING KEY选项,则默认会使用primary table key。

如果内表定义了第二排序索引sorted secondary key,则可以使用 USING KEY 选项来指定这个第二排序索引,即读取时,根据此第二排序Key排序之后的索引来读取,但不能使用secondary hashed key.

如果内表的secondary key 存在,使用了USING KEY时,INDEX选项可以应用到不同类型的内表中(比如可以给Hash内表创建一个第二排序索引sorted secondary key,则在读取此Hash内表时,可以使用索引INDEX方式来读取)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有